package com.wjw.java.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 集合工具类Collections：
 * 1.reverse：集合元素反转
 * 2.shuffle：集合随机排序
 * 3.sort：集合升序排序
 * 4.sort(list,new Comparator)：集合按照比较器规则排序
 * 5.swap(list,i,j)：将集合中索引为i和j的元素位置交换
 * 6.max：集合默认排序,取出最大值
 * 7.max(list,new Comparator)：集合按照比较器规则排序后,取出最大值
 *   min的使用方式同上
 * 8.frequency(list,x)：统计集合中,x在数组中出现的次数
 * 9.copy(new,old)：将old集合拷贝到new集合中,拷贝执行,需初始化new数组中的每一个元素
 * 10.replaceAll(list,oldVal,newVal)：将集合中的oldVal替换成newVal
 * 11.addAll(list,T... elements)：将集合中添加元素
 */
public class CollectionsUtil {
    public static void main(String[] args) {
        System.out.println("##############：Collections操作List集合##############");
        operateList();
        System.out.println("##############：使用Comparable和Comparator排序###############");
        aboutSort();
    }

    /**
     * 1.Collections操作List集合
     */
    public static void operateList(){
        //list
        List<String> list = new ArrayList();
        list.add("bb2");
        list.add("a1");
        list.add("dddd4");
        list.add("ccc3");
        list.add("eeeee5");
        Collections.reverse(list);//5 3 4 1 2
        System.out.println("1.集合元素反转排序:"+list);

        Collections.shuffle(list);//随机
        System.out.println("2.集合元素随机排序:"+list);

        Collections.sort(list);//1 2 3 4 5
        System.out.println("3.集合元素升序排序:"+list);

        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //return o1.compareTo(o2);//按a b c d 排序
                return o2.length() - o1.length();//按字符串的长度排序,长度大的排在前面
            }
        });
        System.out.println("4.集合元素按字符串长度排序:"+list);//5 4 3 2 1

        Collections.swap(list,0 ,4);//交换索引0和4位置的元素
        System.out.println("5.交换索引0和4位置的元素:"+list);//1 4 3 2 5

        String max = Collections.max(list);
        System.out.println("6.按自然排序,取出最大元素:"+max);//5

        String max2 = Collections.max(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);//按a b c d 排序
            }
        });
        System.out.println("7.按abcd排序后,取出最大元素:"+max2);//1
        //Collections.min(list)使用同上

        //list2
        List<String> list2 = new ArrayList<>();
        list2.add("a");
        list2.add("b");
        list2.add("a");
        list2.add("c");
        list2.add("a");
        int count = Collections.frequency(list2, "a");
        System.out.println("8.元素a在集合list2中出现的次数为:"+count);
        System.out.println("list2:"+list2);

        //list3
        List<String> list3 = new ArrayList<>();
        //为了完成一个完整的拷贝,首先要给list3的每一个元素赋值,大小和list2一样
        //否则会抛出异常IndexOutOfBoundsException("Source does not fit in dest");
        for (int i = 0; i < list2.size(); i++) {
            list3.add("");
        }
        Collections.copy(list3,list2);
        System.out.println("9.将list2中的所有元素拷贝到list3中:"+list3);

        Collections.replaceAll(list3,"a","阿");
        System.out.println("10.将list3中的a替换成阿:"+list3);

        //list4
        Collections.addAll(list3,"d","弟");
        System.out.println("11.将list3中添加元素d和弟:"+list3);
    }

    /**
     * 2.使用Comparable和Comparator排序
     *   Comparable：需要实体类implements该接口，然后重写compareTo方法，自己(this)和入参比较。
     *   Comparator：相当于找一个第三方的裁判，比较两个。
     */
    public static void aboutSort(){
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三",18));
        userList.add(new User("张三",28));
        userList.add(new User("李四",18));
        userList.add(new User("王五",8));
        Collections.sort(userList);
        System.out.println(userList);

        System.out.println("---------------------------------");

        List<Person> personList = new ArrayList<>();
        personList.add(new Person("张三",18));
        personList.add(new Person("张三",28));
        personList.add(new Person("李四",18));
        personList.add(new Person("王五",8));
        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();//升序
            }
        });
        System.out.println(personList);
    }
}

/**
 * 使用Collections.sort()对用户年龄进行升序排序
 * User类需实现Comparable接口,并重写compareTo()方法
 */
class User implements Comparable<User>{

    private String name;

    private int age;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public User() {}

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "\n User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(User o) {
        return this.age - o.age;//升序
        //return o.age - this.age;//降序
    }
}

//
class Person{

    private String name;

    private int age;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person() {}

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "\n Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}